#include "../include/stdIO.h"
#include "../include/strings.h"
#include "../include/getnum.h"
#include "../include/libmath.h"
#include "../include/defs.h"
#include "../include/teclado.h"
#include "../include/shell.h"
#include "../include/driverVideo.h"
#include "../include/pruebaExc.h"
#include "../include/kasm.h"

#define getchar()	getc(0)		/*fd=0 es el del teclado, getchar levanta un caracter del teclado*/
#define BUFSHELL 160

extern buf * fileDesc[MAXFILES];
buf bufShell;
char bufferShell[BUFSHELL];
extern buf bufTec;
extern int shift;
extern buf * fileDesc[MAXFILES];
extern buf bufShell;


//le paso un entero y lo imprime en pantallas
void
printInt(unsigned int c)
{
     if( c < 0)
       {
          putc('-',1);
          c *= -1;
        } 
        if( c < 10)
	  putc('0' + c, 1);
	else
	{
	  printInt(c/10);
	  putc('0' + c%10, 1);
	}
	return;
}

//le paso el fb, y devuelve un int
void
waitChar()
{  	char bufferShell[BUFSHELL];
	bufShell.buf = bufferShell;
	bufShell.offset = 0;
	bufShell.siguiente = 0;
	bufShell.size = BUFSHELL;
	char entrada;
	int flag = 1;
	
 	
	do
	{	entrada = getc(0);
		if( entrada == KEY_ENTER)
		{	
			flag = 0;
			isEnter();
		}
		else if( entrada == BKSP)
		{
			if(bufShell.siguiente != 0)
			{	isBksp();
				bufShell.siguiente--;
			}
		}
		else
		{
			if(bufShell.siguiente+1>9)
				/*flag=0*/;
			else{
				bufShell.buf[bufShell.siguiente++] = entrada;
				putc(entrada,1);
			}
		}
	}
	while(flag);
	
	return;
}


unsigned int
getint()
{
	int i, j, flag = 0;         //el flag se activa si el caracter ingresado no es un digito
	unsigned int resp;
	bufShell.siguiente = bufShell.offset;
	do	waitChar();
	while(bufShell.siguiente == bufShell.offset);
	
	i = bufShell.offset;       //indice inicial del vector a recorrer
	j = bufShell.siguiente;    //final de vector 
		
		for(i; i < j && flag == 0; i++)
		{ 
			if(!isdigit(bufShell.buf[i]))
			{	
				return -1;
			}
	
		}
		resp = deCharInt(bufShell.buf,bufShell.offset, i-1);
		
	return resp;
}
//recibe un vector de char, y los pasa a int

unsigned int
deCharInt(char * vec, int i, int dim)
{
    unsigned int resp;
//	unsigned int max=2147483646;
    resp = 0;
	if(dim-i>170)
		return -1;
    for(; i <= dim; i++)
    {	
	//putc(vec[dim-i],1);
	
        resp += ((vec[dim-i]-'0') * pow(10,i)); 
	
    }

    return resp;
}
//recibe un hexa y pasa un int
long
getHexa(void)
{
        int i, j;             //el flag se activa, si el caracter ingresado no esta entre 0 y F.
        long resp;                   
	

	bufShell.siguiente = bufShell.offset;
	do{
	waitChar();
	}while(bufShell.siguiente == bufShell.offset);

	
        i = bufShell.offset;       //indice inicial del vector a recorrer
        j = bufShell.siguiente;    //final de vector
        
        for(i; i < j; i++)
	{ 
            if(!ishexa(bufShell.buf[i]))
	    {
	      return -1;
	    }
	}
	resp = deHexaInt(bufShell.buf,bufShell.offset, i-1);
	
        return resp;
}
//le pasas un vector con un nro Hexa, y te pasa el nro a entero. i es donde inicia el vector.
long
deHexaInt(char *vec, int i, int dim)
{
    int j;
    long resp = 0;
    char c;

    for(j = 0; i <= dim; j++, i++)
    {
      c = vec[dim-i];
      if(isdigit(c) == 1)
      {
	resp += (c -'0') * pow(16,j);
      }
      else if(isupper(c) == 1)
      {
	resp += (c - 'A' + 10) * pow(16,j);
      }
      else if(islower(c) == 1)
      {
	resp += (c - 'a' + 10) * pow(16,j);
      }
      isEnter();
    }
    isEnter();
    return resp;
}
//le pasas un int, y te imprime el nro en hexa
void
printHexa(unsigned int num, int fd)
{
    static const char tHexa[] = {"0123456789ABCDEF"};

    if(num < 0)
      return;
    if(num < 16)
      putc(tHexa[num],fd);
    else
    {
      printHexa(num/16, fd);
      putc(tHexa[num%16],fd);
    }
}

